Linux BSP实战课(网络篇):数据包的接收过程-腾讯云开发者社区-腾讯云

本文将介绍在Linux系

统中,以一个UDP包的接收过程作为示例,介绍数据包是如何一步一步从网卡传到进程手中的。

网卡到内存

网络接口卡必须安装与之匹配的驱动程序才能正常工作。这些驱动程序被视为内核模块,其主要职责是连接网卡和内核中的网络模块。在加载驱动程序时,驱动程序将自身注册到网络模块中。当相应的网卡接收到数据包时,网络模块将调用相应的驱动程序来处理数据。

下图展示了数据包(packet)如何进入内存,并被内核的网络模块开始处理:

内核的网络模块

软中断会触发内核网络模块中的软中断处理函数,后续流程如下:

协议栈

IP层

由于是UDP包,所以第一步会进入IP层,然后一级一级的函数往下调:

UDP层

socket

应用层一般有两种方式接收数据,一种是recvfrom函数阻塞在那里等着数据来,这种情况下当socket收到通知后,recvfrom就会被唤醒,然后读取接收队列的数据;另一种是通过epoll或者select监听相应的socket,当收到通知后,再调用recvfrom函数去读取接收队列的数据。两种情况都能正常的接收到相应的数据包。

结束语

了解数据包的接收流程有助于帮助我们搞清楚我们可以在哪些地方监控和修改数据包,哪些情况下数据包可能被丢弃,为我们处理网络问题提供了一些参考,同时了解netfilter中相应钩子的位置,对于了解iptables的用法有一定的帮助。

本文参与 腾讯云自媒体分享计划 ,分享自微信公众号。

请 Ta 喝咖啡 ☕️